from PyQt5.QtWidgets import QWidget,QPushButton,QApplication,QGridLayout,QLabel,QVBoxLayout,QLCDNumber,QMessageBox,QProgressBar
from PyQt5.QtCore import QTimer, QDateTime,Qt,QThread,pyqtSignal
import sys
#第二种和方案等待测试     http://www.pythonheidong.com/blog/article/171275/
from PyQt5.uic.properties import QtCore


class ui(QWidget):

    def __init__(self):
        super().__init__()

        self.win = QWidget()
        layout = QVBoxLayout(self)
        self.win.resize(50, 50)
        self.btn = QPushButton(self)
        self.btn2 = QPushButton(self)

        self.progressBar = QProgressBar()
        self.btn.setText('开始')
        self.btn2.setText('停止')
        self.lab = QLabel(self)
        self.lab.setText('我是ui界面的默认内容')

        # ①这里在实例化线程对象时，可以传入一个数据供子线程完成任务
        self.my_thaer = thread(data=self)


        # 绑开始按钮的信号与槽绑定
        self.btn.clicked.connect(self._Slot)
        # 结束按钮的信号与曹绑定
        self.btn2.clicked.connect(self.stopThread)


        # 线程的信号与UI的槽进行连接
        self.my_thaer.signal.connect(self.updat_lab)


        layout.addWidget(self.btn)
        layout.addWidget(self.btn2)

        layout.addWidget(self.lab)
        layout.addWidget(self.progressBar)
    def _Slot(self):
        #界面ui发出信号
        print("界面ui发出信号")
        #self.siganl.emit()
        self.my_thaer.start()
        self.my_thaer.eventDispatcher()

    def updat_lab(self,item):
        self.lab.setText('我是从子线程里面传来的更新信号,传递过来的参数是%s'%(item))
        self.progressBar.setValue(item)

    def stopThread(self):
        print('ui界面发出了 停止 信号')
        self.my_thaer.terminate() #这里是停止线程的关键点[进程终止]
        self.btn2.setText('停止')


class thread(QThread):
    # 定义一个具有传递int参数的信号
    signal = pyqtSignal(int)
    # ②这里是初始化一个成员变量
    def __init__(self, data, parent=None):
        QThread.__init__(self, parent)
        self.data=data
        # print('这是收到的主线程传来的参数%s'%self.data)
    def run(self):
        for i in range(1000000):
            self.sleep(1)
            #线程类发出信号
            self.signal.emit(i)
            print('这是从UI界面传进来的数据%s'%self.data)
            self.data.btn.setText("😯牛逼，我是在子线程里更新的UI哦😯")
            print('这是从线程中发出信号%d'%i)

if __name__ == '__main__':
    app=QApplication(sys.argv)
    win=ui()
    win.show()

    sys.exit(app.exec())